home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / win_os2.swg / 0042_Windows File Manager Exte.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  24KB  |  826 lines

  1. {
  2. From: vincze@dseg.ti.com (MICHAEL A VINCZE 0171847)
  3.  
  4. Well after posting the question about how to create a Windows
  5. File Manager extension and not getting any responses, I figured
  6. that not a lot of people know how to do.  So after several hours,
  7. as typical with translating something from C to Pascal, I finally
  8. got the following example to work.  Note that the example consists
  9. of four files:
  10.  
  11.   constant.pas
  12.   xtension.pas
  13.   xtension.rc
  14.   icon.zip     <- this is uuencoded here.
  15.  
  16. Just FYI one of the hardest items to figure out was the parameter info
  17. for the FMExtensionProc function.  The Borland supplied WFEXT.PAS file
  18. is totally bogus.  The key was to pass lParam by reference, and not
  19. by value.  Hence the following:
  20.  
  21.   function FMExtensionProc (Handle: HWnd; Msg: WORD; var lParam: Longint):
  22.   HMENU; export;                                     ^^^
  23.  
  24. Evidently, the File Manager allocates space for a TFMS_LOAD structure (record)
  25. and passes the address to this structure via the lParam parameter.  This should
  26. lead you to a rule of thumb for translating Windows C programs to Pascal.
  27. I leave the wording for the rule of thumb up to yourself to figure out.
  28.  
  29. Best regards,
  30. Michael Vincze
  31. mav@asd470.dseg.ti.com
  32.  
  33. ---------- snip ---------- snip ---------- snip ----------
  34.  
  35. unit constant;
  36.  
  37. interface
  38.  
  39. const
  40.  
  41.   { menu items (must within the range of 1 to 99
  42.   }
  43.   IDM_STATUSWIN         =  10;
  44.   IDM_GETFILESELLFN     =  15;
  45.   IDM_GETDRIVEINFO      =  20;
  46.   IDM_GETFOCUS          =  25;
  47.   IDM_RELOADEXTENSIONS  =  30;
  48.   IDM_REFRESHWINDOW     =  35;
  49.   IDM_REFRESHALLWINDOWS =  40;
  50.   IDM_ABOUTEXT          =  45;
  51.  
  52.  
  53.   { dialog items
  54.   }
  55.   IDD_PATH              =  206;
  56.   IDD_VOLUME            =  207;
  57.   IDD_SHARE             =  208;
  58.   IDD_TOTALSPACE        =  209;
  59.   IDD_FREESPACE         =  210;
  60.  
  61.   IDD_SELFILECOUNT      =  201;
  62.   IDD_SELFILESIZE       =  202;
  63.  
  64.  
  65.   { miscellaneous items
  66.   }
  67.   STATUS_WIDTH          =  400;
  68.   STATUS_HEIGHT         =  100;
  69.   INFO_LINE_WIDTH       =  300;
  70.   INFO_LINE_HEIGHT      =  18;
  71.   INFO_LINE_X           =  10;
  72.   INFO_LINE_Y           =  20;
  73.   ID_STATUSTIMER        =  99;
  74.   INFO_STR_LEN          =  50;
  75.   TIMER_DURATION        =  1500;  { 1.5 seconds }
  76.   PATH_NAME_LEN         =  260;
  77.   VOLUME_NAME_LEN       =  14;
  78.   SHARE_NAME_LEN        =  128;
  79.   SMALL_STR_LEN         =  12;
  80.   LONG_STR_LEN          =  60;
  81.  
  82. implementation
  83.  
  84. end.
  85.  
  86. ---------- snip ---------- snip ---------- snip ----------
  87.  
  88. library XTension;
  89.  
  90. { Author:   Michael Vincze  07/30/94                              }
  91. {           vincze@lobby.ti.com                                   }
  92. {           mav@asd470.dseg.ti.com                                }
  93. {                                                                 }
  94. { The following File Manager extension is a translation from C.   }
  95. { The C code was taken from the Microsoft Product Support         }
  96. { Services, and obtained from the anonymous FTP site              }
  97. { ftp.microsoft.com with a file name of 4-23.zip.  The main       }
  98. { preamble of the original source has been preserved below.       }
  99.  
  100. (*
  101. //***************************************************************************
  102. //
  103. //  Library:
  104. //      XTENSION.DLL
  105. //
  106. //
  107. //  Author:
  108. //      Microsoft Product Support Services.
  109. //
  110. //
  111. //  Purpose:
  112. //      XTENSION is a File Manager extension DLL.  An extension DLL adds
  113. //      a menu to File Manager, contains entry point that processes menu
  114. //      commands and notification messages sent by File Manager, and
  115. //      queries data and information about the File Manager windows.  The
  116. //      purpose of an extension DLL is to add administration support
  117. //      features to File Manager, for example, file and disk utilities.
  118. //      Up to five extension DLLs may be instaled at any one time.
  119. //
  120. //      XTENSION adds a menu called "Extension" to File manager and
  121. //      processes all the messages that are sent by File Manager to an
  122. //      extension DLL.  In order to retrieve any information, it sends
  123. //      messages to File Manager.  It also creates a topmost status window
  124. //      using the DLL's instance handle.
  125. //
  126. //
  127. //  Usage:
  128. //      File Manager installs the extensions that have entries in the
  129. //      [AddOns] section of the WINFILE.INI initialization file.  An entry
  130. //      consists of a tag and a value.  To load XTENSION.DLL as a File
  131. //      Manager extension, add the following to WINFILE.INI (assuming the
  132. //      DLL resides in c:\win\system):
  133. //
  134. //      [AddOns]
  135. //      SDK Demo Extension=c:\win\system\xtension.dll
  136. //
  137. //
  138. //  Menu Options:
  139. //      Following menu items belong to the "Extension" menu that is added
  140. //      to File Manager:
  141. //
  142. //      Status Window               - Shows/Hides status window
  143. //      Selected File(s) Size...    - Displays disk space taken by the files
  144. //      Selected Drive Info...      - Displays selected drive information
  145. //      Focused Item Info           - Displays the name of the focused item
  146. //      Reload Extension            - Reloads this extension
  147. //      Refresh Window              - Refreshes File Manager's active window
  148. //      Refresh All Windows         - Refreshes all the File Manager's windows
  149. //      About Extension...          - Displays About dialog
  150. //
  151. //
  152. //  More Info:
  153. //      Query on-line help on: FMExtensionProc, File Manager Extensions
  154. //
  155. //
  156. // COPYRIGHT:
  157. //
  158. //   (C) Copyright Microsoft Corp. 1993.  All rights reserved.
  159. //
  160. //   You have a royalty-free right to use, modify, reproduce and
  161. //   distribute the Sample Files (and/or any modified version) in
  162. //   any way you find useful, provided that you agree that
  163. //   Microsoft has no warranty obligations or liability for any
  164. //   Sample Application Files which are modified.
  165. //
  166. //***************************************************************************
  167. *)
  168.  
  169.  
  170.  
  171. {$D File Manager Extension DLL}
  172.  
  173. {$R XTENSION}
  174.  
  175. uses
  176.   WinTypes,
  177.   WinProcs,
  178.   Win31,
  179.   WFExt,
  180.   Constant;
  181.  
  182. const
  183.   gszDllWndClass    : PChar   = 'ExtenStatusWClass';  { Class name for status
  184. window      }
  185.   ghwndStatus       : HWND    = 0;                    { Status window          
  186.           }
  187.   ghwndInfo         : HWND    = 0;                    { Child window of status
  188. window     }
  189.   ghDllInst         : THANDLE = 0;                    { DLL's instance handle  
  190.           }
  191.   ghMenu            : HMENU   = 0;                    { Extension's menu handle
  192.           }
  193.   gwMenuDelta       : WORD    = 0;                    { Delta for extension's
  194. menu items  }
  195.   gbStatusWinVisible: BOOLEAN = FALSE;                { Flag for status window 
  196.           }
  197.                                                       {   FALSE=Hidden, 
  198. TRUE=Visible     }
  199.  
  200. { type to handle passing Longint types to wvsprintf
  201. }
  202. type
  203.   TLongRec = record
  204.     LO: WORD;
  205.     HI: WORD;
  206.     end;
  207.  
  208. procedure DisplayStatus (Handle: HWND; wEvent: Longint);
  209. var
  210.   wFileCount: Longint;
  211.   szInfo    : array [0..INFO_STR_LEN] of CHAR;
  212.   lFileCount: TLongRec;
  213. begin
  214. if gbStatusWinVisible = TRUE then
  215.   begin
  216.   case wEvent of
  217.  
  218.     FMEVENT_INITMENU:
  219.       SetWindowText (ghwndInfo, 'Extension menu selected...');
  220.  
  221.     FMEVENT_SELCHANGE:
  222.       begin
  223.       wFileCount := SendMessage (Handle, FM_GETSELCOUNTLFN, 0, 0);
  224.       lFileCount.LO := LOWORD (wFileCount);
  225.       lFileCount.HI := HIWORD (wFileCount);
  226.       wvsprintf (szInfo, 'File selection changed: %ld item(s) selected...',
  227. lFileCount);
  228.       SetWindowText (ghwndInfo, szInfo);
  229.       end;
  230.  
  231.     FMEVENT_UNLOAD:
  232.       SetWindowText (ghwndInfo, 'Unloading extension...');
  233.  
  234.     FMEVENT_USER_REFRESH:
  235.       SetWindowText (ghwndInfo, 'Refreshing window(s)...');
  236.  
  237.     end;
  238.  
  239.   { Timer to erase the info after the elapsed time
  240.   }
  241.   SetTimer (ghwndStatus, ID_STATUSTIMER, TIMER_DURATION, nil);
  242.   end;
  243. end;
  244.  
  245.  
  246.  
  247. function StatusWndProc (hWin: HWND; uMessage: WORD; wParam: WORD; lParam:
  248. Longint): Longint; export;
  249. begin
  250. case uMessage of
  251.  
  252.   WM_TIMER:
  253.     { This timer is used to erase info from the
  254.       status window at the elapsed time
  255.     }
  256.     if wParam = ID_STATUSTIMER then
  257.       begin
  258.       KillTimer (hWin, wParam);
  259.       SetWindowText (ghwndInfo, '');
  260.       end;
  261.  
  262.   else
  263.     begin
  264.     StatusWndProc := DefWindowProc (hWin, uMessage, wParam, lParam);
  265.     exit;
  266.     end;
  267.  
  268.   end;
  269.  
  270. StatusWndProc := 0;
  271. end;
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279. function CreateStatusWindow (hwndExtension: HWND): BOOLEAN;
  280. var
  281.   wc: TWNDCLASS;
  282. begin
  283. wc.style            := 0;
  284. wc.lpfnWndProc      := @StatusWndProc;
  285. wc.cbClsExtra       := 0;
  286. wc.cbWndExtra       := 0;
  287. wc.hInstance        := ghDllInst;
  288. wc.hIcon            := LoadIcon (0, IDI_APPLICATION);
  289. wc.hCursor          := LoadCursor (0, IDC_ARROW);
  290. wc.hbrBackground    := COLOR_WINDOW + 1;
  291. wc.lpszMenuName     := nil;
  292. wc.lpszClassName    := gszDllWndClass;
  293.  
  294. if not RegisterClass (wc) then
  295.   begin
  296.   CreateStatusWindow := FALSE;
  297.   exit;
  298.   end;
  299.  
  300. ghwndStatus := CreateWindowEx (WS_EX_TOPMOST or WS_EX_DLGMODALFRAME,
  301.                                gszDllWndClass,
  302.                                'File Manager Extension',
  303.                                WS_POPUP or WS_CAPTION,
  304.                                CW_USEDEFAULT,
  305.                                CW_USEDEFAULT,
  306.                                STATUS_WIDTH,
  307.                                STATUS_HEIGHT,
  308.                                hwndExtension,
  309.                                0,
  310.                                ghDllInst,
  311.                                nil);
  312.  
  313. ghwndInfo := CreateWindow ('STATIC',
  314.                            nil,
  315.                            WS_CHILD or WS_VISIBLE,
  316.                            INFO_LINE_X,
  317.                            INFO_LINE_Y,
  318.                            INFO_LINE_WIDTH,
  319.                            INFO_LINE_HEIGHT,
  320.                            ghwndStatus,
  321.                            1,
  322.                            ghDllInst,
  323.                            nil);
  324.  
  325. { note I changed the logic from the original code below to return TRUE iff both
  326.   windows got created.
  327. }
  328. CreateStatusWindow := (ghwndStatus <> 0) and (ghwndInfo <> 0);
  329. end;
  330.  
  331.  
  332.  
  333.  
  334. function DriveInfoDlgProc (hDlg: HWND; uMessage: WORD; wParam: WORD; lParam:
  335. Longint): BOOLEAN; export;
  336. var
  337.   fmsDriveInfo: TFMS_GETDRIVEINFO;
  338.   szTempString: array [0..SMALL_STR_LEN] of Char;
  339.   lTotalSpace : TLongRec;
  340.   lFreeSpace  : TLongRec;
  341. begin
  342.  
  343. ·
  344. (continued next message)
  345.  
  346. ─ Area: U-PASCAL      |61 ────────────────────────────────────────────────────
  347.   Msg#: 6684                                         Date: 08-04-94  07:28
  348.   From: Vincze@dseg.ti.com                           Read: Yes    Replied: No 
  349.     To: All                                          Mark:                     
  350.   Subj: [A] Windows File Manager
  351. ──────────────────────────────────────────────────────────────────────────────
  352. @SUBJECT:[A] Windows File Manager Extension                           
  353. ·(Continued from last message)
  354. case  uMessage of
  355.  
  356.   WM_INITDIALOG:
  357.  
  358.     begin
  359.     SendMessage (lParam, FM_GETDRIVEINFO, 0, Longint (PFMS_GETDRIVEINFO
  360. (@fmsDriveInfo)));
  361.  
  362.     { Convert OEM characters to Windows characters
  363.     }
  364.     OemToAnsi (fmsDriveInfo.szPath, fmsDriveInfo.szPath);
  365.     OemToAnsi (fmsDriveInfo.szVolume, fmsDriveInfo.szVolume);
  366.  
  367.     if fmsDriveInfo.szShare[0] <> #0 then
  368.       OemToAnsi (fmsDriveInfo.szShare, fmsDriveInfo.szShare)
  369.     else
  370.       lstrcpy (fmsDriveInfo.szShare, '< Not a Share >');
  371.  
  372.     if fmsDriveInfo.szVolume[0] <> #0 then
  373.       SetDlgItemText (hDlg, IDD_VOLUME, fmsDriveInfo.szVolume)
  374.     else
  375.       SetDlgItemText (hDlg, IDD_VOLUME, '< No volume label >');
  376.  
  377.     SetDlgItemText (hDlg, IDD_PATH, fmsDriveInfo.szPath);
  378.     SetDlgItemText (hDlg, IDD_SHARE, fmsDriveInfo.szShare);
  379.  
  380.  
  381.     { When a -1 is returned for either dwTotalSpace or dwFreeSpace,
  382.       the extension will have compute that number on its own.
  383.     }
  384.     if fmsDriveInfo.dwTotalSpace = -1 then
  385.       SetDlgItemText (hDlg, IDD_TOTALSPACE, '< Info. not available >')
  386.     else
  387.       begin
  388.       lTotalSpace.LO := LOWORD (fmsDriveInfo.dwTotalSpace);
  389.       lTotalSpace.HI := HIWORD (fmsDriveInfo.dwTotalSpace);
  390.       wvsprintf (szTempString, '%ld', lTotalSpace);
  391.       SetDlgItemText (hDlg, IDD_TOTALSPACE, szTempString);
  392.       end;
  393.  
  394.     if fmsDriveInfo.dwFreeSpace = -1 then
  395.       SetDlgItemText (hDlg, IDD_FREESPACE, '< Info. not available >')
  396.     else
  397.       begin
  398.       lFreeSpace.LO := LOWORD (fmsDriveInfo.dwFreeSpace);
  399.       lFreeSpace.HI := HIWORD (fmsDriveInfo.dwFreeSpace);
  400.       wvsprintf (szTempString, '%ld', lFreeSpace);
  401.       SetDlgItemText (hDlg, IDD_FREESPACE, szTempString);
  402.       end;
  403.  
  404.     DriveInfoDlgProc := TRUE;
  405.     exit;
  406.     end;
  407.  
  408.   WM_COMMAND:
  409.  
  410.     case wParam of
  411.  
  412.       IDOK,
  413.       IDCANCEL:
  414.         begin
  415.         EndDialog (hDlg, 1);
  416.         DriveInfoDlgProc := TRUE;
  417.         exit;
  418.         end;
  419.  
  420.       end;
  421.  
  422.   end;
  423.  
  424. DriveInfoDlgProc := FALSE;
  425. end;
  426.  
  427.  
  428.  
  429.  
  430.  
  431. function SelFileInfoDlgProc (hDlg: HWND; uMessage: WORD; wParam: WORD; lParam:
  432. Longint): BOOLEAN; export;
  433. const
  434.   fmsFileInfo  : TFMS_GETFILESEL = (wTime: 0);
  435. var
  436.   wSelFileCount: WORD;
  437.   lSelFileCount: TLongRec;
  438.   wIndex       : WORD;
  439.   szTempString : array [0..SMALL_STR_LEN] of Char;
  440.   dwTotalSize  : Longint;
  441.   lTotalSize   : TLongRec;
  442. begin
  443. case uMessage of
  444.  
  445.   WM_INITDIALOG:
  446.     begin
  447.     wSelFileCount := SendMessage (lParam, FM_GETSELCOUNTLFN, 0, 0);
  448.     lSelFileCount.LO := LOWORD (wSelFileCount);
  449.     lSelFileCount.HI := HIWORD (wSelFileCount);
  450.     wvsprintf (szTempString, '%ld', lSelFileCount);
  451.     SetDlgItemText (hDlg, IDD_SELFILECOUNT, szTempString);
  452.     dwTotalSize := 0;
  453.     if wSelFileCount > 0 then
  454.       for wIndex := 0 to wSelFileCount -1 do
  455.         begin
  456.         SendMessage (HWND (lParam), FM_GETFILESELLFN, wIndex, Longint
  457. (PFMS_GETFILESEL (@fmsFileInfo)));
  458.         Inc (dwTotalSize, fmsFileInfo.dwSize);
  459.         end;
  460.     lTotalSize.LO := LOWORD (dwTotalSize);
  461.     lTotalSize.HI := HIWORD (dwTotalSize);
  462.     wvsprintf (szTempString, '%ld bytes', lTotalSize);
  463.     SetDlgItemText (hDlg, IDD_SELFILESIZE, szTempString);
  464.     SelFileInfoDlgProc := TRUE;
  465.     exit;
  466.     end;
  467.  
  468.   WM_COMMAND:
  469.     case wParam of
  470.  
  471.       IDOK,
  472.       IDCANCEL:
  473.         begin
  474.         EndDialog (hDlg, 1);
  475.         SelFileInfoDlgProc := TRUE;
  476.         exit;
  477.         end;
  478.  
  479.       end;
  480.  
  481.   end;
  482. SelFileInfoDlgProc := FALSE;
  483. end;
  484.  
  485.  
  486.  
  487.  
  488. function AboutDlgProc (hDlg: HWND; uMessage: WORD; wParam: WORD; lParam:
  489. Longint): BOOLEAN; export;
  490. begin
  491. case uMessage of
  492.  
  493.   WM_INITDIALOG:
  494.     begin
  495.     AboutDlgProc := TRUE;
  496.     exit;
  497.     end;
  498.  
  499.   WM_COMMAND:
  500.     case wParam of
  501.  
  502.       IDOK,
  503.       IDCANCEL:
  504.         begin
  505.         EndDialog (hDlg, 1);
  506.         AboutDlgProc := TRUE;
  507.         exit;
  508.         end;
  509.  
  510.       end;
  511.  
  512.   end;
  513. AboutDlgProc := FALSE;
  514. end;
  515.  
  516.  
  517.  
  518. function FMExtensionProc (Handle: HWnd; Msg: WORD; var lParam: Longint): HMENU;
  519. export;
  520. var
  521.   lpload      : PFMS_LOAD;
  522.   lpDialogProc: TFARPROC;
  523.   wFocusedItem: WORD;
  524. begin
  525.  
  526. case Msg of
  527.  
  528.   { ****************** File Manager Events
  529.   }
  530.  
  531.   FMEVENT_INITMENU:
  532.     DisplayStatus (Handle, Msg);
  533.  
  534.   FMEVENT_LOAD:
  535.     { Create status window
  536.     }
  537.     begin
  538.     if ghwndStatus = 0 then
  539.       begin
  540.       if not CreateStatusWindow (Handle) then
  541.         begin
  542.         MessageBox (Handle,
  543.           'Extension not loaded.  Status window creation error.',
  544.           'File Manager Extension', MB_OK or MB_ICONASTERISK);
  545.  
  546.         { Unload
  547.         }
  548.         end;
  549.       end;
  550.  
  551.     lpload := @lParam;
  552.  
  553.     { Assign the menu handle from the DLL's resource
  554.     }
  555.     ghMenu := LoadMenu (ghDllInst, 'ExtensionMenu');
  556.  
  557.     lpload^.Menu := ghMenu;
  558.  
  559.     { This is the delta we are being assigned.
  560.     }
  561.     gwMenuDelta := lpload^.wMenuDelta;
  562.  
  563.     { Size of the load structure
  564.     }
  565.     lpload^.dwSize := sizeof (TFMS_LOAD);
  566.  
  567.     { Assign the popup menu name for this extension
  568.     }
  569.     lstrcpy (lpload^.szMenuName, '&Extension');
  570.  
  571.     MessageBox (Handle, 'File Manager Extension will be loaded.',
  572.       'File Manager Extension', MB_OK);
  573.  
  574.     { Return that handle
  575.     }
  576.  
  577.     FMExtensionProc := ghMenu;
  578.     exit;
  579.     end;
  580.  
  581.   FMEVENT_SELCHANGE:
  582.     DisplayStatus (Handle, Msg);
  583.  
  584.   FMEVENT_UNLOAD:
  585.     begin
  586.     DisplayStatus (Handle, Msg);
  587.     MessageBox (Handle, 'File Manager Extension will be unloaded.',
  588.       'File Manager Extension', MB_OK);
  589.  
  590.     { Since the status window was created using DLL's
  591.       instance handle, we will have to destroy it on our own.
  592.     }
  593.     DestroyWindow (ghwndStatus);
  594.     end;
  595.  
  596.   FMEVENT_USER_REFRESH:
  597.     DisplayStatus (Handle, Msg);
  598.  
  599.  
  600.   { ****************** Extension menu commands
  601.   }
  602.  
  603.   IDM_STATUSWIN:
  604.     begin
  605.     if GetMenuState (ghMenu, gwMenuDelta + Msg, MF_BYCOMMAND) and MF_CHECKED >
  606. 0 then
  607.       begin
  608.       gbStatusWinVisible := FALSE;
  609.  
  610.       { Hide the status window
  611.       }
  612.       ShowWindow (ghwndStatus, SW_HIDE);
  613.  
  614.       { Remove the checkmark
  615.       }
  616.       CheckMenuItem (ghMenu, gwMenuDelta + IDM_STATUSWIN, MF_UNCHECKED or
  617. MF_BYCOMMAND);
  618.  
  619.       end
  620.     else
  621.       begin
  622.       gbStatusWinVisible := TRUE;
  623.  
  624.       { Show the status window
  625.       }
  626.       ShowWindow (ghwndStatus, SW_SHOW);
  627.  
  628.       { Add the checkmark
  629.       }
  630.       CheckMenuItem (ghMenu, gwMenuDelta + IDM_STATUSWIN, MF_CHECKED or
  631. MF_BYCOMMAND);
  632.       end;
  633.     end;
  634.  
  635.   IDM_GETDRIVEINFO:
  636.     begin
  637.     lpDialogProc := @DriveInfoDlgProc;
  638.     DialogBoxParam (ghDllInst, 'DriveInfo', Handle, lpDialogProc, Handle);
  639.     end;
  640.  
  641.   IDM_GETFILESELLFN:
  642.     begin
  643.     lpDialogProc := @SelFileInfoDlgProc;
  644.     DialogBoxParam (ghDllInst, 'FileInfo', Handle, lpDialogProc, Handle);
  645.     end;
  646.  
  647.   IDM_GETFOCUS:
  648.     begin
  649.     wFocusedItem := SendMessage (Handle, FM_GETFOCUS, 0, 0);
  650.  
  651.     case wFocusedItem of
  652.       FMFOCUS_DIR:
  653.         MessageBox (Handle, 'Focus is on the DIRECTORY window.',
  654.           'Focus Information', MB_OK);
  655.  
  656.       FMFOCUS_TREE:
  657.         MessageBox (Handle, 'Focus is on the TREE window.',
  658.           'Focus Information', MB_OK);
  659.  
  660.       FMFOCUS_DRIVES:
  661.         MessageBox (Handle, 'Focus is on the DRIVE bar.',
  662.           'Focus Information', MB_OK);
  663.  
  664.       FMFOCUS_SEARCH:
  665.  
  666.         MessageBox (Handle, 'Focus is on the SEARCH RESULTS window.',
  667.           'Focus Information', MB_OK);
  668.  
  669.       end;
  670.  
  671.     end;
  672.  
  673.   IDM_REFRESHWINDOW,
  674.   IDM_REFRESHALLWINDOWS:
  675.     { Refresh one or all the windows
  676.     }
  677.     begin
  678.     if Msg = IDM_REFRESHALLWINDOWS then
  679.       SendMessage (Handle, FM_REFRESH_WINDOWS, 1, 0)
  680.     else
  681.       SendMessage (Handle, FM_REFRESH_WINDOWS, 0, 0);
  682.     end;
  683.  
  684.   IDM_RELOADEXTENSIONS:
  685.     PostMessage (Handle, FM_RELOAD_EXTENSIONS, 0, 0);
  686.  
  687.   IDM_ABOUTEXT:
  688.     begin
  689.     lpDialogProc := @AboutDlgProc;
  690.     DialogBox (ghDllInst, 'AboutExtension', Handle, lpDialogProc);
  691.     end;
  692.  
  693.   end;
  694.  
  695. FMExtensionProc := 0;
  696. end;
  697.  
  698. exports
  699.   FMEXTENSIONPROC;
  700.  
  701. begin
  702. ghDllInst := hInstance;
  703. end.
  704.  
  705.  
  706. ·
  707. (continued next message)
  708.  
  709. ─ Area: U-PASCAL      |61 ────────────────────────────────────────────────────
  710.   Msg#: 6685                                         Date: 08-04-94  07:28
  711.   From: Vincze@dseg.ti.com                           Read: Yes    Replied: No 
  712.     To: All                                          Mark:                     
  713.   Subj: [A] Windows File Manager
  714. ──────────────────────────────────────────────────────────────────────────────
  715. @SUBJECT:[A] Windows File Manager Extension                           
  716. ·(Continued from last message)
  717. ---------- snip ---------- snip ---------- snip ----------
  718.  
  719.  
  720.  
  721. #include "constant.pas"
  722.  
  723. ExtensionIcon   ICON    xtension.ico
  724.  
  725.  
  726. ExtensionMenu MENU
  727. BEGIN
  728.   MENUITEM    "&Status Window",           IDM_STATUSWIN
  729.   MENUITEM    SEPARATOR
  730.   MENUITEM    "Selected &File(s) Size...",IDM_GETFILESELLFN
  731.   MENUITEM    "Selected &Drive Info...",  IDM_GETDRIVEINFO
  732.   MENUITEM    "Focused &Item Info...",    IDM_GETFOCUS
  733.   MENUITEM    SEPARATOR
  734.   MENUITEM    "Reload &Extension",        IDM_RELOADEXTENSIONS
  735.   MENUITEM    "&Refresh &Window",          IDM_REFRESHWINDOW
  736.   MENUITEM    "Refresh All &Windows",      IDM_REFRESHALLWINDOWS
  737.   MENUITEM    SEPARATOR
  738.   MENUITEM    "&About Extension...",      IDM_ABOUTEXT
  739. END
  740.  
  741. FileInfo DIALOG 22, 17, 144, 71
  742. STYLE DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
  743. CAPTION "Selected File Information"
  744. FONT 8, "Helv"
  745. BEGIN
  746.   CONTROL "OK", IDOK, "BUTTON", WS_GROUP, 56, 49, 32, 14
  747.   LTEXT "File(s) selected:", -1, 10, 7, 64, 8
  748.   LTEXT "Disk space taken:", -1, 10, 20, 64, 8
  749.   LTEXT " ", IDD_SELFILECOUNT, 77, 7, 56, 8
  750.   LTEXT " ", IDD_SELFILESIZE, 77, 20, 56, 8
  751. END
  752.  
  753. AboutExtension DIALOG 8, 21, 237, 215
  754. STYLE DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
  755. CAPTION "About Extension"
  756. FONT 8, "Helv"
  757. BEGIN
  758.   ICON "ExtensionIcon", -1, 5, 5, 16, 21
  759.   LTEXT "File Manager Extension DLL", -1, 34, 5, 150, 8
  760.   LTEXT "Version 1.0", -1, 34, 15 150, 8
  761.   LTEXT "Copyright \251 Microsoft Corp., 1992", -1, 34, 25, 150, 8
  762.   LTEXT "A File Manager extension is a Windows DLL that adds a menu to", -1, 5,
  763. 40, 232, 8
  764.   LTEXT "File Manager, contains entry point that processes menu commands", -1,
  765. 5, 50, 232, 8
  766.   LTEXT "and notification messages sent by File Manager, and queries data", -1,
  767. 5, 60, 232, 8
  768.   LTEXT "and information about the File Manager windows.", -1, 5, 70, 232, 8
  769.   LTEXT "Menu Options:", -1, 5, 85, 237, 8
  770.   LTEXT "Status Window\t\t- Shows/Hides status window", -1, 5, 98, 230, 8
  771.   LTEXT "Selected File(s) Size...\t- Displays disk space taken by the files",
  772. -1, 5, 108, 230, 8
  773.   LTEXT "Selected Drive Info...\t- Displays selected drive information", -1, 5,
  774. 118, 230, 8
  775.   LTEXT "Focused Item Info...\t- Displays the name of the focused item", -1, 5,
  776. 128, 230, 8
  777.   LTEXT "Reload Extension\t- Reloads this extension", -1, 5, 138, 230, 8
  778.   LTEXT "Refresh Window\t- Refreshes File Manager's active window", -1, 5, 148,
  779. 230, 8
  780.   LTEXT "Refresh All Windows\t- Refreshes all the File Manager's windows", -1,
  781. 5, 158, 230, 8
  782.   LTEXT "About Extension...\t- Displays this dialog", -1, 5, 168, 230, 8
  783.   CONTROL "OK", IDOK, "BUTTON", WS_GROUP, 101, 190, 32, 14
  784. END
  785.  
  786.  
  787.  
  788. DriveInfo DIALOG 22, 17, 188, 85
  789. STYLE DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
  790. CAPTION "Selected Drive Information"
  791. FONT 8, "Helv"
  792. BEGIN
  793.   CONTROL "OK", IDOK, "BUTTON", WS_GROUP, 77, 65, 32, 14
  794.   LTEXT "Path:", -1, 7, 6, 46, 8
  795.   LTEXT "Volume:", -1, 7, 16, 46, 8
  796.   LTEXT "Share:", -1, 7, 26, 46, 8
  797.   LTEXT "Total KBs:", -1, 7, 36, 46, 8
  798.   LTEXT "Free KBs:", -1, 7, 46, 46, 8
  799.   LTEXT " ", IDD_PATH, 61, 6, 120, 8
  800.   LTEXT " ", IDD_VOLUME, 61, 16, 120, 8
  801.   LTEXT " ", IDD_SHARE, 61, 26, 120, 8
  802.   LTEXT " ", IDD_TOTALSPACE, 61, 36, 120, 8
  803.   LTEXT " ", IDD_FREESPACE, 61, 46, 120, 8
  804. END
  805.  
  806. ---------- snip ---------- snip ---------- snip ----------
  807.  
  808.  
  809.  
  810. begin 755 icon.zip
  811. M4$L#!!0    ( "IC;!E>O+@&9@$  #X$   ,    6%1%3E-)3TXN24-/K9,]
  812. M;H- $(4'B!4D%\X-0A6E1.( ^!2IJ;B!:V]E(5ERKD))EST*E447I"B1"\>;
  813. M-[,_%I:C1%$>/-8SWWH81D 444Q9%A,KCX@>L&;9G<0#TD_(/7(.7A+OCX3Y
  814. MY5+&F/ [,4=4GU%LWA6LQ?U*QZ\KN_H<S71B/F4-N1_VH@$=F9/ >T-NJB
  815. M!W.@"";V&B[A^__V$3[!AJU@I^F\;J0G%5^?%XB<I)1=^. 4+EIK?AHY\5!V
  816. MX<-,Y_R=YELK-;"(4I=O^49-1?/28K4_#/U04UIVK+;=G':JJ2MPW(;YF()7
  817. MX$F1,Q\]1RQ\<!R%)]S5]_^7\8RA?B'*U1Y)YIU5NZGKBKF?D/0O]6U_4N9<
  818. MOTF9?S!'OFN[? <]A_Z:0C:,OO^NR.U\RBVNS&WLZY^Y[3=PUV_@;KZ>+_P+
  819. MX&)R?/OF8O^ +RX.&T;ZBXQ]"1;P+7]NWW^5OU5BKEG!&N[A$?;Z E!+ 0(4
  820. M !0    ( "IC;!E>O+@&9@$  #X$   ,            (         !85$5.
  821. >4TE/3BY)0T]02P4&      $  0 Z    D $     
  822.  
  823. end
  824.  
  825. ---------- END ---------- END ---------- END ---------- END ----------
  826.